﻿/*!
* @file BackgroundSubtractorRadialReachFilter.h
* @author 橋本敦史
* @date Last Change:2010/Apr/03.
*/
#ifndef __BGS_RADIAL_REACH_FILTER_H__
#define __BGS_RADIAL_REACH_FILTER_H__

#include "ImageBackgroundSubtractAlgorithm.h"

namespace mmpl{
	namespace image{

		/*!
		* @class RadialReachFilterによる背景差分
		*/
		class BackgroundSubtractorRadialReachFilter:public BackgroundSubtractAlgorithm{

		public:
			//! gaussian_sigmaの初期値は画像サイズ320x240に対しての原著のもの。
			BackgroundSubtractorRadialReachFilter(unsigned char gaussian_threshold=190,double gaussian_sigma=3.5);
			virtual ~BackgroundSubtractorRadialReachFilter();
			virtual void apply(const Image& img,BGSubtractedImage* oimg);


			void setBGImage(const Image& bg);
			void setThreshold(const Image& bg0,const Image& bg1,double sigma_enphasis=2.0, double over_detection_cost=0.5);
			Image getReffPixelDistribution(double* emphasis);

			/*** 単なるAccessor ***/
			int getEnoughDiffThreshold()const;
			int getBitDiffThreshold()const;

			void setGaussianSigma(double gaussian_sigma);
			double getGaussianSigma()const;

			void setGaussianThreshold(int gaussian_threshold);
			int getGaussianThreshold()const;

			const Image* getRRCImage()const;

		protected:
			//! 各背景画素毎の大小関係のbit列
			Image bg_bit_pattern;
			Image rrc;
			//! 各背景画素毎に決められた8方向それぞれの参照点
			std::vector<std::vector<CvPoint> > ref_points;
			//! リーチの伸長を決める閾値
			int enough_diff;
			//! bitの違いを決める閾値
			int bit_diff;
			//! ガウスフィルター適用後に前景、背景を決める閾値
			unsigned char gaussian_threshold;
			//! ガウスフィルターに用いる標準偏差
			double gaussian_sigma;

			//! 閾値enough_diffとbit_diffがセットされているかどうか
			bool isThresholdSet;
			//! 背景画像がセットされているかどうか
			bool isBGset;

			unsigned char searchAround(int x,int y,const Image& bgimage,std::vector<CvPoint>* points);

			unsigned char getForeBitPattern(int x,int y,const Image& fgimage,const std::vector<CvPoint>& points)const;

			char direction[8][2];
		private:
			void init();
			static unsigned char calcBitDiff(unsigned char a,unsigned char b);	
		};

	} // namespace image
} // namespace mmpl
#endif // __BGSRADIALREACHFILTER_H__

